package br.com.ProjetoTCC_JSF.controller;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

import org.primefaces.event.SelectEvent;

import br.com.ProjetoTCC_JSF.metodos.Log;
import br.com.ProjetoTCC_JSF.modelo.bean.TpComponente;
import br.com.ProjetoTCC_JSF.modelo.bean.TpDetalhe;
import br.com.ProjetoTCC_JSF.modelo.bean.TpItem;
import br.com.ProjetoTCC_JSF.modelo.dao.CreateEntityManagerFactory;
import br.com.ProjetoTCC_JSF.modelo.dao.DaoResource;
import br.com.ProjetoTCC_JSF.modelo.dao.Persisted;

@ManagedBean(name="tpItemMB")
@ViewScoped
public class TpItemMB implements Persisted{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private Boolean bTpItem = false;
	private Boolean bTpComponente = true;
	private Boolean bNewTpComponente = true;
	private Boolean bTpDetalhe = true;

	private DaoResource daoResource;
	private EntityManagerFactory factory;
	private EntityManager manager;

	private TpItem tpItem = new TpItem();
	private TpComponente tpComponente = new TpComponente();
	private TpDetalhe tpDetalhe = new TpDetalhe();
	
	private List<TpComponente> lTpComponente = new ArrayList<TpComponente>();
	private List<TpDetalhe> lTpDetalhe = new ArrayList<TpDetalhe>();

	@PostConstruct
	public void criou() {			
		tpComponente.setTpDetalhes(lTpDetalhe);
		tpItem.setTpComponentes(lTpComponente);
		
		System.out.println("CRIOU O TPITEM:");	
	}
	
	@PreDestroy
	public void morreu() {
		System.out.println("MORREU!!!");
	}
	
	@Override
	public EntityManagerFactory createEntityManagerFactory() {
		CreateEntityManagerFactory cemf = new CreateEntityManagerFactory();
		factory = cemf.createEntityManagerFactory();

		return factory;
	}
	
	@Override
	public EntityManager creatEntityManager() {
		
		manager = factory.createEntityManager();
		return manager;
	}

	public void onRowSelectTpComponente(SelectEvent event){

		this.setTpComponente((TpComponente) event.getObject()); 

		System.out.println((TpComponente) event.getObject());
		System.out.println(tpComponente.getNmTpComponente());
		System.out.println(tpComponente.getTpDetalhes().size());
	} 

	public void addTpComponente() {
		tpComponente.setCdTpItem(tpItem);

		lTpComponente.add(tpComponente);

		desabilitaBTpComponente();
	}

	public void addNewTpComponente() {
		
		lTpDetalhe = new ArrayList<TpDetalhe>();

		tpComponente = new TpComponente();

		tpComponente.setTpDetalhes(lTpDetalhe);

		desabilitaBNewTpComponente();
	}

	public void addTpDetalhe() {

		if(lTpDetalhe.size() == 0){
			tpDetalhe.setCdTpComponente(tpComponente);

			tpComponente.getTpDetalhes().add(tpDetalhe);

			tpDetalhe = new TpDetalhe();
			System.out.println("Entrou no if!");
		}
		else{
			tpDetalhe.setCdTpComponente(tpComponente);

			tpComponente.getTpDetalhes().add(tpDetalhe);
			tpDetalhe = new TpDetalhe();

			System.out.println("Entrou no else");

		}

		System.out.println(lTpDetalhe.size());
		bNewTpComponente = false;
	}

	public void desabilitaBTpItem() {
		bTpItem = true;
		bTpComponente = false;
	}

	public void desabilitaBTpComponente() {
		bTpComponente = true;
		bTpDetalhe = false;
	}

	public void desabilitaBNewTpComponente() {
		bNewTpComponente = true;
		bTpDetalhe = true;
		bTpComponente = false;
	}

	public String salvar() {
		daoResource = new DaoResource();

		try {
			daoResource.save(tpItem, this);
			
			return "/WEB-INF/view/addSucesso.xhtml";

		} catch (Exception e) {
			Log.enviaMessagemParaTela(FacesMessage.SEVERITY_ERROR, "Erro ao tentar salvar Tipo de Item! ", 
					e.getMessage()+" .Procure o administrador do sistema!");		
			
			return "/WEB-INF/view/addErro.xhtml";
		}
	}

	//Getters and Setters
	public TpItem getTpItem() {
		return tpItem;
	}

	public void setTpItem(TpItem tpItem) {
		this.tpItem = tpItem;
	}

	public TpComponente getTpComponente() {
		return tpComponente;
	}

	public void setTpComponente(TpComponente tpComponente) {
		this.tpComponente = tpComponente;
		
		System.out.println("AQUI!!!");
	}

	public TpDetalhe getTpDetalhe() {
		return tpDetalhe;
	}

	public void setTpDetalhe(TpDetalhe tpDetalhe) {
		this.tpDetalhe = tpDetalhe;
	}

	public Boolean getbTpItem() {
		return bTpItem;
	}

	public void setbTpItem(Boolean bTpItem) {
		this.bTpItem = bTpItem;
	}

	public Boolean getbTpComponente() {
		return bTpComponente;
	}

	public void setbTpComponente(Boolean bTpComponente) {
		this.bTpComponente = bTpComponente;
	}

	public Boolean getbTpDetalhe() {
		return bTpDetalhe;
	}

	public void setbTpDetalhe(Boolean bTpDetalhe) {
		this.bTpDetalhe = bTpDetalhe;
	}

	public List<TpComponente> getlTpComponente() {
		return lTpComponente;
	}

	public void setlTpComponente(List<TpComponente> lTpComponente) {
		this.lTpComponente = lTpComponente;
	}

	public List<TpDetalhe> getlTpDetalhe() {
		return lTpDetalhe;
	}

	public void setlTpDetalhe(List<TpDetalhe> lTpDetalhe) {
		this.lTpDetalhe = lTpDetalhe;
	}

	public Boolean getbNewTpComponente() {
		return bNewTpComponente;
	}

	public void setbNewTpComponente(Boolean bNewTpComponente) {
		this.bNewTpComponente = bNewTpComponente;
	}
}